#ifndef DOCUMENTPAGE_H_
#define DOCUMENTPAGE_H_

#include <QtGui>
#include "notes.h"
#include "notesdialog.h"

class QRubberBand;

/*!
 * Klasa reprezentujaca aktualnie wyswietlana strone dokumentu
 */
class DocumentPage : public QLabel{
Q_OBJECT

public:
	DocumentPage(QWidget *parent=0);
	~DocumentPage();

	void mousePressEvent(QMouseEvent *event);
	void mouseMoveEvent(QMouseEvent *event);
	void mouseReleaseEvent(QMouseEvent *);
	void contextMenuEvent(QContextMenuEvent *event);
	QMatrix matrix() const;

	void createTextNote(QPointF point);
	void createRectNote(QRectF rect);

signals:
	void textNoteAdded(TextNote *note);
	void rectNoteAdded(RectNote *note);
	void areaSelected(const QRectF rect);
	void notesChanged();

public slots:
	inline void changeScale(double scale) { currentScale=scale; }
	inline void changePage(int page) { currentPage=page; }
	void addTextNote(bool add);
	void addRectNote(bool add);
	void getSelection(bool get);
	void selectAll();

	/*!
	 * Sloty dla zdarzen menu kontekstowego
	 */
	void deleteTriggered();
	void changeTextTriggered();
	void drawTriggered();
	void dontDrawTriggered();

	void drawNoteText(QRectF rect);
	inline void setNotes(PageNotes *pnotes) { notes=pnotes; };
	inline void setSearchLocation(QRectF location) { searchLocation=location; };
	void setImg(QImage img);

private :
	/*!
	 * Nr Bierzacej strony dokumentu
	 */
	int currentPage;
	/*!
	 * Aktualna skala dokumentu
	 */
	double currentScale;
	/*!
	 * Podstawowa rozdzielczosc dokumentu
	 */
	static const double res=72.0;
	/*!
	 * Tryb pracy - reakcja na zdarzenia myszy
	 */
	int clickMode;

	/*!
	 * Kolekcja notatek bierzacej strony
	 */
	PageNotes *notes;
	/*!
	 * Obszar zawierajacy wyszukiwany tekst (do zaznaczenia)
	 */
	QRectF searchLocation;
	/*!
	 * Obrecz do zaznaczania
	 */
	QRubberBand *rubberBand;
	/*!
	 * Miejsce w ktorym nastapil poczatek przeciagania myszy
	 */
	QPoint dragPosition;
	/*!
	 * Lista elementow pomocniczych reprezentujacych notatki na stronie
	 */
	QList<ClickPoint> clickPoints;

	//context menu
	/*!
	 * Notatka, dla ktorej wywolane zostalo menu kontekstowe
	 */
	Note *contextNote;
	/*!
	 * Akcje menu kontekstowego
	 */
	QAction *actionDelete;
	QAction *actionChangeText;
	QAction *actionDrawText;
	QAction *actionCancelDraw;

	/*!
	 * Przeksztalcenie informacji o zaznaczonym obszarze i wyemitowanie sygnalu o zaznaczeniu
	 */
	void selectedArea(const QRectF &rect);
	/*!
	 * Pokazanie tresci notatki jako tooltip
	 */
	bool event(QEvent *event);
	/*!
	 * Sprawdzenie, czy w aktualnej pozycji znajduje sie jakas notatka
	 */
	int itemAt(const QPoint &pos);

	/*!
	 * Obliczenie domyślego obszaru do wypisania tekstu notatki
	 */
	QRectF findPrintRect(QFontMetrics &fm, QPointF  &point, QString text);

	/*!
	 * Tryby pracy, zaleza od nich reakcje na zdarzenia myszy:
	 * None - klikniecie na punkt reprezentujacy notatke powoduje jej wyswietlenie w oknie NotesDialog,
	 * TextNoteMode - dodawanie prostej notatki tekstowej,
	 * RectNoteMode - dodawanie notatki zaznaczajacej obszar,
	 * SelectMode - zaznaczanie obszaru (do skopiowania),
	 * DrawMode - manualne wskarywanie obszatu do wypisania tresci notatki,
	 *
	 * IconSize - dodatkowa stala pomocnicza okreslajaca rozmiar punktu reprezentujacego notatke
	 * (jesli w opcjach wylaczano wyswietlanie ikony notatki)
	 */
	enum {None, TextNoteMode, RectNoteMode, SelectMode, DrawMode, IconSize=11};
};

#endif /* DOCUMENTPAGE_H_ */
